#include "disk.h"

Disk::Disk()
{
    diskCommand = "iostat -d -x -k";
}

/*
  $iostat -d -x -k
Linux 2.6.28-11-generic (yzj) 	2012年02月06日 	_i686_	(1 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               4.35    25.33   10.93   16.44   189.51   167.66    26.09     2.64   94.92   12.10  149.98   2.73   7.47
        char device[10];
        float rrqmps;  //每秒进行 merge 的读操作数目
        float wrqmps;  //每秒进行 merge 的写操作数目
        float rps;     //每秒完成的读 I/O 设备次数
        float wps;     //每秒完成的写 I/O 设备次数
        float rKBps;   //每秒读K字节数
        float wKBps;   //每秒写K字节数
        float avgrq_sz;//平均每次设备I/O操作的数据大小
        float avgqu_sz;//平均I/O队列长度
        float await;    //平均每次设备I/O操作的等待时间 (毫秒)
        float svctm;    // 平均每次设备IO操作的服务时间（毫秒）
        float percUtil; //一秒中有百分之多少的时间用于 I/O 操作
*/
void Disk::SeperateString(char *result, DiskItem *pDiskItem)
{
    char *tmp = NULL;
//    char delim[] = "\n";
    char delims[] = " ";
//    char tmpcpy[1024];
//
//    tmp = strtok(result,delim);
//
//    tmp = strtok(NULL,delim);
//
//    tmp = strtok(NULL,delim);
    // 此时的tmp 为“sda               4.35    25.33   10.93   16.44   189.51   167.66    26.09     2.64   94.92   12.10  149.98   2.73   7.47”
//    tmp = strtok(NULL,delim);

    // 有错误
//    strcpy(tmpcpy,tmp);
    //
    tmp = strtok(result,delims);
    //
    tmp =strtok(NULL,delims);
    pDiskItem->rrqmps = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->wrqmps = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->rps = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->wps = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->rKBps = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->wKBps = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->avgrq_sz = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->avgqu_sz = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->await = tmp;
    //
    tmp = strtok(NULL,delims);
    //
    tmp = strtok(NULL,delims);
    pDiskItem->svctm = tmp;
    //
    tmp = strtok(NULL,delims);
    pDiskItem->percUtil = tmp;
}

void Disk::GetDiskInfo(Disk *pDisk, QMultiMap<QString, QPair<QString, QString> > *pmultiMap)
{

    QPair<QString, QString> kv;
    QString cate = "Disk";

    int size = 1024;
    char result[size];
    const char *fileName = "disk.out";

    ExecuteCommand(diskCommand, fileName, result, size, 4);
//    printf("%s\n", result);
//    CommandPipe(diskCommand,result,size);
    SeperateString(result, &(pDisk->sDiskItem));

    kv.first = "rrqm/s";
    kv.second = pDisk->sDiskItem.rrqmps;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "wrqm/s";
    kv.second = pDisk->sDiskItem.wrqmps;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "r/s";
    kv.second = pDisk->sDiskItem.rps;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "w/s";
    kv.second = pDisk->sDiskItem.wps;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "rKB/s";
    kv.second = pDisk->sDiskItem.rKBps;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "wKB/s";
    kv.second = pDisk->sDiskItem.wKBps;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "avgrq_sz";
    kv.second = pDisk->sDiskItem.avgrq_sz;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "avgqu_sz";
    kv.second = pDisk->sDiskItem.avgqu_sz;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "await";
    kv.second = pDisk->sDiskItem.await;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "svctm";
    kv.second = pDisk->sDiskItem.svctm;
    pmultiMap->insert(cate, kv);
    //
    kv.first = "percUtil";
    kv.second = pDisk->sDiskItem.percUtil;
    pmultiMap->insert(cate, kv);


}
